home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Demos Are Forever / Amiga CD-Sensation - Ausgabe 1 - Demos Are Forever (1996)(GTI - Schatztruhe)(DE)[!].iso / Big Bunch / The Rest / Mapping Demo / RRT.c < prev    next >
C/C++ Source or Header  |  1993-03-28  |  12KB  |  399 lines

  1. ;/* Realtime Ray Tracer
  2. lc -b1 -ccit -v -D RRT.c
  3. quit
  4. */
  5.  
  6. #include "rrt.h"
  7.  
  8. /*** MED MUSIC ***/
  9. extern struct MMD0 far MEDSONG;
  10.  
  11. /***** Declarations for CBACK *****/
  12. long _BackGroundIO = 0;
  13. char *_procname = 0;
  14. long _stack = 10000;
  15. long _priority = 50;
  16.  
  17. int CXBRK(void) { return(0); }        /* Disable Lattice CTRL-C handling */
  18. int chkabort(void) { return(0); }        /* really */
  19.  
  20. /*****  Libraries and HardWare  *****/
  21. struct IntuitionBase *IntuitionBase=NULL;
  22. struct GfxBase       *GfxBase=NULL;
  23. extern struct Custom __far custom;
  24.  
  25. /*****  Graphics Data  *****/
  26. extern unsigned char far BM0[32000];
  27. extern unsigned char far BM1[32000];
  28.  
  29. char FastRead[8000];
  30. ULONG output;
  31.  
  32. extern unsigned char far SILVERFOX[1];
  33. UWORD ImageDataBall[] = {
  34.   0x003F,0xF800,0x00F0,0xFE00,0x03C0,0x3380,0x06CF,0x33C0,
  35.   0x0F00,0xC8E0,0x1B00,0xCCF0,0x3D3C,0xEC78,0x3F3C,0xEC38,
  36.   0x6B3C,0xE63C,0x433C,0xE63C,0x9300,0xE63E,0xB900,0xCC3E,
  37.   0x9CFF,0x8C3E,0x9E7F,0x1C3E,0x8F3C,0x3C1E,0x8F80,0x3C0E,
  38.   0x8FC0,0x3E06,0x87E0,0x3F02,0xC1F8,0x1F82,0xC0FC,0x0FC2,
  39.   0xE07C,0x07C2,0x703C,0x03C0,0x7838,0xF1CC,0x3C31,0xF8C8,
  40.   0x3C33,0x0CF8,0x1E33,0x0CF0,0x0E33,0x0F20,0x0733,0x0B00,
  41.   0x038D,0xFC80,0x00E6,0x6800,0x003E,0x0800,
  42.  
  43.   0x003F,0xF800,0x00FF,0xFE00,0x0380,0x0F80,0x070F,0x0FC0,
  44.   0x0C7F,0xC7E0,0x1CFF,0xC3F0,0x31C3,0xE3F8,0x33C3,0xE3F8,
  45.   0x73C3,0xE1FC,0x73C3,0xE1FC,0xE3FF,0xE1FE,0xC1FF,0xC3FE,
  46.   0xE0FF,0x83FE,0xE07F,0x03FE,0xF03C,0x03FE,0xF000,0x03FE,
  47.   0xF000,0x01FE,0xF800,0x00FE,0xFE00,0x007E,0xFF00,0x003E,
  48.   0xFF80,0x003E,0x7FC0,0x003C,0x7FC0,0xF03C,0x3FC1,0xF838,
  49.   0x3FC3,0xFC38,0x1FC3,0xFC30,0x0FC3,0xFCE0,0x07C3,0xF8C0,
  50.   0x03F1,0xF380,0x00F8,0x6600,0x003F,0xF800,
  51.  
  52.   0x003F,0xF800,0x00FF,0xFE00,0x03FF,0xFF80,0x07F0,0xFFC0,
  53.   0x0F80,0x3FE0,0x1F00,0x3FF0,0x3E00,0x1FF8,0x3C00,0x1FF8,
  54.   0x7C00,0x1FFC,0x7C00,0x1FFC,0xFC00,0x1FFE,0xFE00,0x3FFE,
  55.   0xFF00,0x7FFE,0xFF80,0xFFFE,0xFFC3,0xFFFE,0xFFFF,0xFFFE,
  56.   0xFFFF,0xFFFE,0xFFFF,0xFFFE,0xFFFF,0xFFFE,0xFFFF,0xFFFE,
  57.   0xFFFF,0xFFFE,0x7FFF,0xFFFC,0x7FFF,0x0FFC,0x3FFE,0x07F8,
  58.   0x3FFC,0x03F8,0x1FFC,0x03F0,0x0FFC,0x03E0,0x07FC,0x07C0,
  59.   0x03FE,0x0F80,0x00FF,0x9E00,0x003F,0xF800
  60. };
  61.  
  62. /****
  63. struct BitMap
  64.   { UWORD BytesPerRow, Rows;
  65.     UBYTE Flags, Depth;
  66.     UWORD   pad;
  67.     PLANEPTR Planes[8]; }
  68. ****/
  69. struct BitMap BMap[] =
  70. {{ 40, 200, 0, 4, 0, &BM0[0], &BM0[8000], &BM0[16000], &BM0[24000],  NULL, NULL, NULL, NULL },
  71.  { 40, 200, 0, 4, 0, &BM1[0], &BM1[8000], &BM1[16000], &BM1[24000],  NULL, NULL, NULL, NULL },
  72.  { 40, 200, 0, 4, 0, &BM1[0], &BM1[0], &BM1[0], &BM1[0], NULL, NULL, NULL, NULL },
  73.  { 40, 200, 0, 1, 0, &BM0[24000], NULL, NULL, NULL, NULL, NULL, NULL, NULL },
  74.  { 40, 200, 0, 1, 0, &BM0[16000], NULL, NULL, NULL, NULL, NULL, NULL, NULL }
  75. };
  76.  
  77. struct RasInfo  *DB_rinfo = NULL;
  78. struct ViewPort *vport = NULL;
  79.  
  80. struct NewScreen NewScreenStructure = {
  81.     0,0,    /* screen XY origin relative to View */
  82.     320,200,    /* screen width and height */
  83.     4,    /* screen depth (number of bitplanes) */
  84.     0,1,    /* detail and block pens */
  85.     SPRITES,    /* display modes for this screen */
  86.     CUSTOMSCREEN|CUSTOMBITMAP,    /* screen type */
  87.     NULL,    /* pointer to default screen font */
  88.     NULL,    /* screen title */
  89.     NULL,    /* first in list of custom screen gadgets */
  90.     &BMap[0]    /* pointer to custom BitMap structure */
  91. };
  92.  
  93. struct Screen *MyScreen=NULL;
  94.  
  95. struct NewWindow NewWindowStructure1 = {
  96.     0,0,    /* window XY origin relative to TopLeft of screen */
  97.     320,200,    /* window width and height */
  98.     0,1,    /* detail and block pens */
  99.     VANILLAKEY,    /* IDCMP flags */
  100.     /* other window flags */
  101.     SIMPLE_REFRESH|BORDERLESS|RMBTRAP|NOCAREREFRESH|BACKDROP|ACTIVATE,
  102.     NULL,    /* first gadget in gadget list */
  103.     NULL,    /* custom CHECKMARK imagery */
  104.     NULL,    /* window title */
  105.     NULL,    /* custom screen pointer */
  106.     NULL,    /* custom bitmap */
  107.     1,1,    /* minimum width and height */
  108.     -1,-1,    /* maximum width and height */
  109.     CUSTOMSCREEN    /* destination screen type */
  110. };
  111.  
  112. struct Window *MyWindow=NULL;
  113.  
  114. struct UCopList   usercopper;
  115.  
  116. UWORD ColorPalettes[][32] =
  117. {
  118.   { 0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
  119.     0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
  120.     0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
  121.     0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 },
  122.   { 0x000,0xFFF,0xFEF,0xEDF,0xDCF,0xDBF,0xCAF,0xC9F, /* SilverFox Colors */
  123.     0xB8F,0xB6F,0xA5F,0xA4F,0x93F,0x92F,0x81F,0x80F,
  124.     0x0F0,0xF00,0xD00,0xB00,0x900,0x800,0x600,0x400, /* Reflect Colors */
  125.     0x0F0,0xAAF,0x99D,0x88B,0x779,0x668,0x556,0x444 },
  126.  
  127.   { 0x000,0x558,0x88B,0xFFF,0x000,0x558,0x88B,0xFFF, /* Plane and stars */
  128.     0x49F,0x49F,0x49F,0x49F,0x00F,0x00F,0x00F,0x00F }
  129. };
  130.  
  131. short Xarray[32][32];
  132. short Yarray[32][32];
  133. ULONG Yoffsets[200];
  134.  
  135. extern ULONG far NOMOUSE[];
  136.  
  137. extern UWORD chip Sprite2_data[31*2+4];
  138. extern UWORD chip Sprite3_data[31*2+4];
  139. extern UWORD chip Sprite3a_data[31*2+4];
  140. extern UWORD chip Sprite4_data[31*2+4];
  141. extern UWORD chip Sprite5_data[31*2+4];
  142. extern UWORD chip Sprite5a_data[31*2+4];
  143. struct SimpleSprite Sprite2;
  144. struct SimpleSprite Sprite3;
  145. struct SimpleSprite Sprite4;
  146. struct SimpleSprite Sprite5;
  147. short spg2=0,spg3=0,spg4=0,spg5=0;
  148.  
  149. /* * * * * * * * * * * EXTERNAL ROUTINES * * * * * * * * * */
  150. VOID __regargs UnPackByteRun(UBYTE *from, UBYTE *to);
  151. VOID __regargs ComputeInterColor(UWORD *from, UWORD *to, UWORD step);
  152. VOID __regargs WaitFRAMES(UWORD frames);
  153. VOID __regargs SLAM_BLITTER(BLIT_PARMS *a0);
  154.  
  155. VOID DoDemo();
  156.  
  157. VOID __regargs StarOffsets(ULONG mod_d0);
  158. VOID ComputeStarField();
  159. VOID DisplayStarField();
  160. extern PLANEPTR far Plane1ptr;
  161. extern PLANEPTR far Plane2ptr;
  162.  
  163.  
  164. /***************  Beginning of code  ***************/
  165.  
  166. VOID CleanUp()
  167. {
  168.   if (DB_rinfo!=NULL)
  169.     { vport->UCopIns = NULL; RemakeDisplay(); }
  170.   if (MyWindow!=NULL)
  171.     CloseWindow(MyWindow);
  172.   if (spg5==5) FreeSprite(5);
  173.   if (spg4==4) FreeSprite(4);
  174.   if (spg3==3) FreeSprite(3);
  175.   if (spg2==2) FreeSprite(2);
  176.   if (MyScreen!=NULL)
  177.     { FreeCopList(usercopper.CopList);
  178.       CloseScreen(MyScreen); }
  179.   if (IntuitionBase!=NULL)
  180.     CloseLibrary((struct Library *)IntuitionBase);
  181.   if (GfxBase!=NULL)
  182.     CloseLibrary((struct Library *)GfxBase);
  183.   exit(0);
  184. }
  185.  
  186. VOID __regargs GridZAP(short from,short to,short amount)
  187. {
  188.   BLIT_PARMS myblit;
  189.  
  190.   myblit.dmod=0;
  191.   myblit.con1=0;
  192.   myblit.bmod=-40;
  193.   myblit.con0=(ABC|ABNC|NABC|NABNC)|(DEST|SRCB);
  194.   myblit.addb=8000;
  195.   myblit.addcd=8000;
  196.   myblit.planes=4;
  197.   myblit.bpt=(USHORT *)(&BM1[from*40]);
  198.   myblit.dpt=(USHORT *)(&BM0[to*40]);
  199.   myblit.size=BLTSIZE(20,amount);
  200.   SLAM_BLITTER(&myblit);
  201. }
  202.  
  203. VOID __regargs mybbm(struct Bitmap *f,long fy,struct Bitmap *t,long ty,long h,long m,long p)
  204. { BltBitMap(f,0,fy,t,0,ty,320,h,m,p,0); }
  205.  
  206. VOID InitStuff()
  207. {
  208.   register USHORT loop;
  209.   struct RastPort *RPort;
  210.  
  211. /**** Open Libraries ****/
  212.   if (
  213.     ((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0))==NULL) ||
  214.     ((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
  215.      )
  216.     { CleanUp(); }
  217.  
  218. /***** SCREEN OPEN *****/
  219.   if ((MyScreen=(struct Screen *) OpenScreen(&NewScreenStructure))==NULL)
  220.     CleanUp();
  221.   vport = &(MyScreen->ViewPort);
  222.   vport->SpritePriorities=0;
  223.   LoadRGB4(vport,ColorPalettes[0],32);
  224.  
  225. /*****  Set Up CopperList *****/
  226.   CINIT(&usercopper,200)
  227.   CWait(&usercopper,37,0); CBump(&usercopper);
  228.   for(loop=1;loop!=16;loop++)
  229.     {
  230.       CMove(&usercopper,(long)&custom.color[loop],ColorPalettes[2][loop]);
  231.       CBump(&usercopper);
  232.     }
  233.   CWait(&usercopper,161,0); CBump(&usercopper);
  234.   for(loop=1;loop!=16;loop++)
  235.     {
  236.       CMove(&usercopper,(long)&custom.color[loop],ColorPalettes[1][loop]);
  237.       CBump(&usercopper);
  238.     }
  239.   CEND(&usercopper)
  240.  
  241. /**** Get Sprites ****/
  242.   if (
  243.     ((spg2=GetSprite(&Sprite2,2))==-1) ||
  244.     ((spg3=GetSprite(&Sprite3,3))==-1) ||
  245.     ((spg4=GetSprite(&Sprite4,4))==-1) ||
  246.     ((spg5=GetSprite(&Sprite5,5))==-1)
  247.      )
  248.     { CleanUp(); }
  249.   Sprite2.height=Sprite3.height=Sprite4.height=Sprite5.height=31;
  250.  
  251.   ChangeSprite(vport,&Sprite2,Sprite2_data);
  252.   ChangeSprite(vport,&Sprite3,Sprite3_data);
  253.   ChangeSprite(vport,&Sprite4,Sprite4_data);
  254.   ChangeSprite(vport,&Sprite5,Sprite5_data);
  255.   Sprite3_data[1]|=SPRITE_ATTACHED;
  256.   Sprite5_data[1]|=SPRITE_ATTACHED;
  257.   Sprite3a_data[1]|=SPRITE_ATTACHED;
  258.   Sprite5a_data[1]|=SPRITE_ATTACHED;
  259.  
  260. /***** WINDOW OPEN *****/
  261.  
  262.   NewWindowStructure1.Screen = MyScreen;
  263.   if ((MyWindow=(struct Window *) OpenWindow(&NewWindowStructure1))==NULL)
  264.     CleanUp();
  265.  
  266.   ShowTitle(MyScreen,FALSE);
  267.   SetPointer(MyWindow,(short*)&NOMOUSE[0],1,16,0,0);
  268.   WaitFRAMES(1);
  269.   RemakeDisplay();
  270.  
  271. /*** Set Up the intuition data for using BM1 as double buffer to BM0 ***/
  272.   DB_rinfo = vport->RasInfo;
  273.  
  274. /*** Show the SilverFox Logo -- BEGIN DEMO  ***/
  275.   RelocModule(&MEDSONG);
  276.   InitPlayer();
  277.   PlayModule(&MEDSONG);
  278.  
  279.   UnPackByteRun(SILVERFOX,BM0);
  280.   for(loop=1; loop<=16; loop++)
  281.     { WaitFRAMES(3); ComputeInterColor(ColorPalettes[0],ColorPalettes[1],loop); }
  282.   mybbm(&BMap[0],0,&BMap[1],0,200,192,15);
  283.   for(loop=1; loop!=107; loop++)
  284.     { WaitFRAMES(1); GridZAP(loop,1,loop); }
  285.   for(loop=1; loop!=36; loop++)
  286.     { WaitFRAMES(2);
  287.       GridZAP(loop+107,loop,107);
  288.       GridZAP(177-loop,177-loop,20); }
  289.  
  290.   vport->UCopIns = &usercopper; RemakeDisplay();
  291.   RPort=MyWindow->RPort;
  292.   SetAPen(RPort,12);
  293.   for(loop=0;loop!=10;loop++)
  294.     {
  295.       Move(RPort,53+loop,50);
  296.       Draw(RPort,53+loop,150);
  297.       Move(RPort,155+loop,50);
  298.       Draw(RPort,155+loop,150);
  299.       Move(RPort,257+loop,50);
  300.       Draw(RPort,257+loop,150);
  301.       Move(RPort,0,95+loop);
  302.       Draw(RPort,319,95+loop);
  303.     }
  304.  
  305.   mybbm(&BMap[1],0,&BMap[2],0,200,0xE0,14);
  306.   mybbm(&BMap[2],0,&BMap[0],40,107,0x60,8);
  307.   mybbm(&BMap[3],40,&BMap[4],40,107,0x80,1);
  308.   memset(BM1,0,8000);
  309.   mybbm(&BMap[0],0,&BMap[2],0,200,0xE0,15);
  310.   OwnBlitter(); WaitBlit(); DisownBlitter();
  311.   memcpy(FastRead,BM1,8000);
  312.   mybbm(&BMap[0],0,&BMap[1],0,200,0xC0,15);
  313.  
  314.   MoveSprite(vport,&Sprite2,100,45);
  315.   MoveSprite(vport,&Sprite4,116,45);
  316.   for(loop=0;loop!=62;loop+=2)
  317.     {
  318. Sprite2_data[2+loop]=ImageDataBall[0+loop];
  319. Sprite2_data[3+loop]=ImageDataBall[31*2+loop];
  320. Sprite3_data[2+loop]=Sprite3a_data[2+loop]=ImageDataBall[31*4+loop];
  321. //Sprite3_data[3+loop]=0;
  322. Sprite4_data[2+loop]=ImageDataBall[1+loop];
  323. Sprite4_data[3+loop]=ImageDataBall[(1+31*2)+loop];
  324. Sprite5_data[2+loop]=Sprite5a_data[2+loop]=ImageDataBall[(1+31*4)+loop];
  325. //Sprite5_data[3+loop]=0;
  326.     }
  327.   StarOffsets(40);
  328.   Plane1ptr=&BM0[46*40+0];
  329.   Plane2ptr=&BM0[46*40+8000];
  330. }
  331.  
  332. VOID CalculateMap()
  333. {
  334.   short  y1,x,x1;
  335.   long   y,x2;
  336.   double r;
  337.  
  338.   for(y=0; y<32; y++)
  339.     {
  340.       y1=y-15;
  341.       for(x=0; x<32; x++)
  342.         {
  343.           x1=x-15;
  344.           x2=(256-(y1*y1)-(x1*x1));
  345.           if (x2>0)
  346.             {
  347.               r=32.0/sqrt((double)x2);
  348.               r*=((double)x1);
  349.               r+=15.5;
  350.               x2=(short)r;
  351.               Xarray[y][x]=x2;
  352.               Yarray[x][y]=x2;
  353.             }
  354.           else
  355.             {
  356.               Xarray[y][x]=9999;
  357.               Yarray[x][y]=9999;
  358.             }
  359.         }
  360.     }
  361.   x2=(ULONG)FastRead;;
  362.   for(y=0;y!=200;y++)
  363.     {
  364.       Yoffsets[y]=x2;
  365.       x2+=40;
  366.     }
  367. }
  368.  
  369. VOID Finish()
  370. {
  371.   short loop;
  372.   struct RastPort *rport;
  373.  
  374.   rport=MyWindow->RPort;
  375.   SetAPen(rport,0);
  376.   for(loop=0;loop!=65;loop++)
  377.     {
  378.       Move(rport,loop,36+loop);
  379.       Draw(rport,319-loop,36+loop);
  380.       Draw(rport,319-loop,163-loop);
  381.       Draw(rport,loop,163-loop);
  382.       Draw(rport,loop,36+loop);
  383.     }
  384.   vport->UCopIns = NULL; RemakeDisplay();
  385.   for(loop=1; loop<=16; loop++)
  386.     { WaitFRAMES(3); ComputeInterColor(ColorPalettes[1],ColorPalettes[0],loop); }
  387.   RemPlayer();
  388. }
  389.  
  390. main()
  391. {
  392.   CalculateMap();
  393.   InitStuff();
  394.   DoDemo();
  395.   Finish();
  396.   CleanUp();
  397. }
  398.  
  399.